/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package gcs.Interface;
import gcs.Negocio.Historico;
import gcs.Negocio.Utilizador;
import gcs.Negocio.TipoServico;
import gcs.Negocio.Contracto;
import gcs.Negocio.Cliente;
import gcs.Negocio.Empresa;
import gcs.Negocio.Servico;
import gcs.Negocio.Actividade;
import gcs.Dados.ClientesBD;
import gcs.Dados.UtilizadoresBD;
import gcs.Dados.ContratoDB;
import gcs.Dados.EmpresasBD;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.TreeMap;
/**
 *
 * @author Nuno
 */
public class GCS {

    private static double taxalucro = 0.15;
    private static TreeMap<String, Utilizador> utilizadores;
    private static TreeMap<String, Cliente> clientes;
    private static TreeMap<String, Empresa> empresas;

    private static TreeMap<Integer,TipoServico> tipoServico;

    private static Utilizador logged;

    private  EmpresasBD ebd = new EmpresasBD();
    private  ClientesBD cbd = new ClientesBD();
    private  ContratoDB contrbd = new ContratoDB();
    private  UtilizadoresBD ubd = new UtilizadoresBD();

    public GCS(){    }

    public boolean login(String user, String pass){
        leUtilizadores();
        Utilizador u = utilizadores.get(user);
        if(u!=null)
            if(u.getPass().equals(pass)){
                logged = new Utilizador(u);
                return true;
            }
        return false;
    }


    public boolean criaUtil(String user,String pass,int t,boolean act){
        Utilizador u = new Utilizador(user, pass, t);
        if(utilizadores.containsKey(user)==true)
            return false;
        return ubd.insereUtil(u);
    }

    public boolean altUtil(String user,String pass,int t,boolean act){
        Utilizador u = new Utilizador(user, pass, t);
        u.setActivo(act);
        return ubd.actUtil(u);


    }

    public boolean removeUtil(String user){
        Utilizador u = new Utilizador(utilizadores.get(user));
        u.setActivo(false);
        return ubd.actUtil(u);
    }
    //public boolean temPermissao(){};

    /*
     * Estou apartir do presuposto que primeiro o utilizador seleciona o contracto
     * depois faz o metodo valor a pagar e depois efectuarpagamento, quando tiver o
     * dinheiro na mao.
     */
    public static Utilizador getUtilizadorLoggado(){
        return logged;
    }
    public static void setUtilizadorLoggado(Utilizador u){
        logged=u;
    }
    public void leUtilizadores(){
        utilizadores = ubd.getUtil();

    }
    public void leRestantes(){
        empresas = ebd.getListaEmp();
        tipoServico = ebd.getListaTiposServ();
        clientes = cbd.getListaCli();
    }
    /*public void efectuarPagamento(Contracto c,int numprestacao){
        Contabilidade ct = new Contabilidade();
        ct.confirmarPagamento(c);
    }*/
    public void valorApagar(Contracto c){
        Contabilidade ct = new Contabilidade();
        ct.valorPagar(c,getTaxalucro());
    }
    public double calcularMargem(Contracto c){
        return c.getTotal()*getTaxalucro();
    }

    //Fluxo de k?
    public void calcularFluxo(){};
    public String visualizarHistorico(Cliente c){
        ArrayList<Historico> hist = c.getHist();
        String texto="";
        for(Historico h : hist){
            texto+=h.toString();
            texto+="\n";
        }
        return texto;
    }


    public static double getTaxalucro() {
        return taxalucro;
    }


    public static TreeMap<String, Utilizador> getUtilizadores() {
        return utilizadores;
    }

    public static TreeMap<String, Cliente> getClientes() {
        return clientes;
    }

    public static TreeMap<String, Empresa> getEmpresas() {
        return empresas;
    }

    public static TreeMap<Integer, TipoServico> getTipoServico() {
        return tipoServico;
    }

    public TipoServico getTipoServico(String cod_e){
        return ebd.getTipoServ(cod_e);
    }


    public static void setTaxalucro(double taxalucro) {
        taxalucro = taxalucro;
    }

    public static void setUtilizadores(TreeMap<String, Utilizador> u) {
        utilizadores = u;
    }

    public static void setClientes(TreeMap<String, Cliente> c) {
        clientes = c;
    }

    public static void setEmpresas(TreeMap<String, Empresa> e) {
        empresas = e;
    }

    public static void setTipoServico(TreeMap<Integer, TipoServico> ts) {
        tipoServico = ts;
    }
    //gets
   public static Empresa getEmpresa(String cod){return empresas.get(cod);}
   public static Servico getServico(String cod_emp,String cod_serv){
       return empresas.get(cod_emp).getServicos().get(cod_serv);
   }
   public static Actividade getActividade(String cod_emp,String cod_serv,String cod_act){
       return empresas.get(cod_emp).getServicos().get(cod_serv).getActividades().get(cod_act);
   }
   //adds
   public void addEmpresa(String nome,String desc,int tipo){
      Empresa emp = new Empresa(nome, desc, true, tipo);
      empresas.put(emp.getCodEmp(), emp);
      ebd.guardaEmpresa(emp);
      //System.out.println("cod:"+emp.getCodEmp()+"nome:"+emp.getNome()+ "tipo:"+emp.getTipo() + "desc"+emp.getDesc()+"activo:" + emp.getActivo() );
   }
   public void addServico(String codEmp,String nome,String desc ){
       Servico serv = new Servico(nome, desc, true);
       empresas.get(codEmp).getServicos().put(serv.getcodServ(), serv);
       ebd.guardaServico(codEmp, serv);
   }
   public void addActividade(String codEmp,String codServ,String nome,String desc,float preco){
       Actividade a = new Actividade(nome, desc, true, preco);
       empresas.get(codEmp).getServicos().get(codServ).getActividades().put(a.getcodAct(), a);
       ebd.guardaActividade(codServ, a);
   }

   //NOVOS METODOS
   //alterar estados de empresas servicos e actividades
   public void alteraEstadoEmp(String codEmp){
       boolean estado = empresas.get(codEmp).getActivo();
       if(estado == true){
           //actualiza estado emp
           empresas.get(codEmp).setActivo(false);
           for(Servico s : empresas.get(codEmp).getServicos().values()){
                s.setActivo(false);
                for(Actividade a : s.getActividades().values())
                    a.setActivo(false);
           }
           //actualiza na BD a emp
           ebd.updateEstadoEmp(codEmp, false);
       }else{
           //actualiza estado emp
            empresas.get(codEmp).setActivo(true);
            for(Servico s : empresas.get(codEmp).getServicos().values()){
                s.setActivo(true);
                for(Actividade a : s.getActividades().values())
                    a.setActivo(true);
            }
            //actualiza na BD a emp
            ebd.updateEstadoEmp(codEmp, true);
       }
   }
   public void alteraEstadoServ(String codEmp,String codServ){
        boolean estado = empresas.get(codEmp).getServicos().get(codServ).getActivo();
       if(estado == true){
           //actualiza estado serv
           empresas.get(codEmp).getServicos().get(codServ).setActivo(false);
            for(Actividade a : empresas.get(codEmp).getServicos().get(codServ).getActividades().values())
                a.setActivo(false);
           //actualiza na BD o serv
           ebd.updateEstadoServ(codServ, false);
       }else{
           //actualiza estado serv
           empresas.get(codEmp).getServicos().get(codServ).setActivo(true);
            for(Actividade a : empresas.get(codEmp).getServicos().get(codServ).getActividades().values())
                a.setActivo(true);
           //actualiza na BD o serv
           ebd.updateEstadoServ(codServ, true);
       }
   }
   public void alteraEstadoAct(String codEmp,String codServ,String codAct){
       boolean estado = empresas.get(codEmp).getServicos().get(codServ).getActividades().get(codAct).getActivo();
       if(estado == true){
           //actualiza estado act
           empresas.get(codEmp).getServicos().get(codServ).getActividades().get(codAct).setActivo(false);
           //actualiza na BD a act
           ebd.updateEstadoAct(codAct, false);
       }else{
           //actualiza estado act
           empresas.get(codEmp).getServicos().get(codServ).getActividades().get(codAct).setActivo(true);
           //actualiza na BD a act
           ebd.updateEstadoAct(codAct, true);
       }

   }
   public static TipoServico getTipoServico(int cod){return tipoServico.get(cod);}

   public void updateEmpresa(String codEmp,String nome,String des,int type){
        Empresa e = empresas.get(codEmp);
        e.setNome(nome);
        e.setDes(des);
        e.setTipo(type);
        ebd.updateEmpresa(e);
   }
   public void updateServico(String codEmp,String codServ,String nome,String des){
        Servico s = getServico(codEmp, codServ);
        s.setNome(nome);
        s.setDes(des);
        ebd.updateServico(codEmp, s);
   }
   public void updateActividade(String codEmp,String codServ,String codAct,String nome,String des,float preco){
        Actividade a = getActividade(codEmp, codServ,codAct);
        a.setNome(nome);
        a.setDes(des);
        a.setPreco(preco);
        ebd.updateActividade(codServ, a);
   }

   public boolean empresaAssociada(String codEmp){
        for(Cliente c : clientes.values())
            for(Contracto co : c.getContractos().values())
                if(co.isActivo()==true && co.getCodEmpresa().equals(codEmp))return true;
         return false;
   }
   public boolean servicoAssociado(String codServ){
        for(Cliente c : clientes.values())
            for(Contracto co : c.getContractos().values())
                if(co.isActivo()==true && co.getCodServico().equals(codServ))return true;
         return false;
   }
   public boolean actividadeAssociada(String codEmp,String codServ,String codAct){
        //vai a cada a actividade de cada contracto e verifica se existe esta actividade
        for(Cliente c : clientes.values())
            for(Contracto co : c.getContractos().values())
                if(co.isActivo()==true)
                    for(Actividade a : co.getListaActividades().values())
                        if(codAct.equals(a.getcodAct()))return true;
         return false;
   }
   public void guardaTipoServ(String tipo){
       TipoServico ts = new TipoServico(tipo);
       tipoServico.put(ts.getCod(), ts);
        ebd.guardaTiposServ(ts);
   }
   public void updateTipoServ(int cod,String tipo){
       TipoServico ts = tipoServico.get(cod);
       ts.setTipo(tipo);
       ebd.updateTipoServico(ts);
   }

   public void criaContr(Contracto c){
       Contracto contr = contrbd.getContr(c.getCodContracto());
       if(contr==null){
           clientes.get(c.getCodCliente()).getContractos().put(c.getCodContracto(), c);
           contrbd.insereContr(c);
       }else{
           clientes.get(c.getCodCliente()).getContractos().put(c.getCodContracto(), c);
           contrbd.insereActContr(c);
           }

   }
   public void inseriHist(Cliente c, String s){
        GregorianCalendar gc = new GregorianCalendar();
        String data  = gc.get(Calendar.HOUR_OF_DAY)+":"+gc.get(Calendar.MINUTE)+":"+gc.get(Calendar.SECOND)+"-"+gc.get(Calendar.DAY_OF_MONTH)+"/"+gc.get(Calendar.MONTH)+"/"+gc.get(Calendar.YEAR);
        Historico h = new Historico(data+"- O cliente "+c.getNome()+" ("+c.getCodCliente()+") "+s);
        c.getHist().add(h);
        cbd.insereHist(c, h);
   }
   public void inactivaContracto(String codCli,String codContr){
        clientes.get(codCli).getContractos().get(codContr).setActivo(false);
   }

}
